
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.desa.view.mbean;

import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.ParametroDto;
import com.brain.core.view.mbean.*;
import com.brain.core.exception.DAOException;
import com.brain.core.manager.RecursosManager;
import com.brain.core.view.util.ConstantesCore;
import com.brain.desa.dto.EvaluacionCompetenciaDto;
import com.brain.desa.manager.EvaluacionCompetenciaManager;
import com.brain.desa.view.util.ConstantesDesa;
import com.brain.sgc.dto.PersonaDto;
import com.brain.sgc.dto.PuestoDto;
import com.brain.sgc.manager.PersonaManager;
import com.brain.sgc.manager.ProcesoEvaluacionManager;
import com.brain.sgc.manager.PuestoManager;
import com.brain.sgc.view.util.ConstantesSgc;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.faces.event.ActionEvent;
import javax.persistence.Transient;
import org.apache.log4j.Logger;
import org.primefaces.event.SelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;


/**
 *
 * @author Hvives
 */
@Controller("evaluacionCompetenciaMBean")
@Scope("session")
public class EvaluacionCompetenciaMBean extends GenericMBean implements Serializable {

    private static Logger logger = Logger.getLogger(EvaluacionCompetenciaMBean.class);
    @Resource
    private EvaluacionCompetenciaManager manager;
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private ProcesoEvaluacionManager procesoEvaluacionManager;
    @Resource
    private PersonaManager personaManager;
    private List<EvaluacionCompetenciaDto> lista;
    private EvaluacionCompetenciaDto dto;
    private EvaluacionCompetenciaDto dtoAux;
    private EvaluacionCompetenciaDto dtoFiltro;
    private String keyTitulo = "evaluacion.desarrollo.panel";
    @Autowired
    private ApplicationMBean applicationMBean;
    private List<PuestoDto> listaPuestoFiltro;
    private List<PuestoDto> listaPuesto;
    private List<ParametroDto> listaEstados;
    private List<ParametroDto> listaUnidadOrgFiltro;
    private List<ParametroDto> listaEstadosFiltro;
    private PersonaDto personaDto;
    @Autowired
    private SessionMBean sessionMBean;
    @Resource
    private EvaluacionCompetenciaArbolMBean evaluacionCompetenciaArbolMBean;
    @Transient
    private Boolean desabilitarArbol;
    @Transient
    private Boolean desabilitarBotonProcesar;
    @Transient
    private Long estadoGT;
    @Transient
    private Long estadoAnulado;

    public EvaluacionCompetenciaMBean() {
        this.dtoFiltro = new EvaluacionCompetenciaDto(); 
    }

    public String iniciar() {
        this.dto = null;
        this.lista = null;
        this.dtoFiltro = new EvaluacionCompetenciaDto();
        this.dtoFiltro.setPersonaDto(new PersonaDto());
        this.dtoFiltro.setPuestoDto(new PuestoDto());
        return ConstantesDesa.UrlNavegacion.URL_LISTA_EVALUACION_COMPETENCIA;
    }

    public String nuevo() {
        sessionMBean.setAccion(ConstantesDesa.Formulario.NUEVO);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        this.lista = new ArrayList<EvaluacionCompetenciaDto>();
        this.desabilitarBotonProcesar = false;
        this.dto = new EvaluacionCompetenciaDto();
        this.dto.setEstadoDto(new ParametroDto(ConstantesDesa.Parametro.EVALUACION_COMPETENCIA_ESTADO_ACTIVO));
        return ConstantesDesa.UrlNavegacion.URL_EVALUACION_COMPETENCIA;
    }

    public String editar() {
        sessionMBean.setAccion(ConstantesDesa.Formulario.EDITAR);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        //ApplicationHelper.cargarPropietarios(ConstantesDesa.Entidad.REQUERIMIENTO, this.dto.getId());
        EvaluacionCompetenciaArbolMBean evalCompArbol = (EvaluacionCompetenciaArbolMBean) WebServletContextListener.getApplicationContext().getBean("evaluacionCompetenciaArbolMBean");
        evalCompArbol.setEvaluacionCompetenciaDto(this.dto);
        if(this.dto.getEstadoDto().getId().equals(ConstantesDesa.Parametro.EVALUACION_COMPETENCIA_ESTADO_HABILITADO) || this.dto.getEstadoDto().getId().equals(ConstantesDesa.Parametro.EVALUACION_COMPETENCIA_ESTADO_GEST_TALENTO)){this.desabilitarArbol=false;}else{this.desabilitarArbol=true;}
        this.evaluacionCompetenciaArbolMBean.buscar();

        return ConstantesDesa.UrlNavegacion.URL_EVALUACION_COMPETENCIA;
    }
    
    public String agregarEvaluacion() {
        sessionMBean.setAccion(ConstantesDesa.Formulario.EDITAR);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        //ApplicationHelper.cargarPropietarios(ConstantesDesa.Entidad.REQUERIMIENTO, this.dto.getId());
        EvaluacionCompetenciaArbolMBean evalCompArbol = (EvaluacionCompetenciaArbolMBean) WebServletContextListener.getApplicationContext().getBean("evaluacionCompetenciaArbolMBean");
        evalCompArbol.setEvaluacionCompetenciaDto(this.dto);
        this.evaluacionCompetenciaArbolMBean.buscar();

        return ConstantesDesa.UrlNavegacion.URL_EVALUACION_COMPETENCIA;
    }

    public String ver() {
        sessionMBean.setAccion(ConstantesDesa.Formulario.VER);
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean.getAccion()));
        EvaluacionCompetenciaArbolMBean evalCompArbol = (EvaluacionCompetenciaArbolMBean) WebServletContextListener.getApplicationContext().getBean("evaluacionCompetenciaArbolMBean");
        evalCompArbol.setEvaluacionCompetenciaDto(this.dto);
        if(this.dto.getEstadoDto().getId().equals(ConstantesDesa.Parametro.EVALUACION_COMPETENCIA_ESTADO_HABILITADO) || this.dto.getEstadoDto().getId().equals(ConstantesDesa.Parametro.EVALUACION_COMPETENCIA_ESTADO_GEST_TALENTO)){this.desabilitarArbol=false;}else{this.desabilitarArbol=true;}
        this.evaluacionCompetenciaArbolMBean.buscar();
        return ConstantesDesa.UrlNavegacion.URL_EVALUACION_COMPETENCIA;
    }

    public void buscar(ActionEvent ae) {
        
        try {
            this.lista = this.manager.obtenerEvaluacionCompetencia(this.dtoFiltro);
        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);
            showError(ex.getMessage());
        }

    }

    public String guardar() {
       try {
             Long IdInhabilitar=this.manager.obtenerIdAnterior(this.dto.getPersonaDto());
             if(IdInhabilitar!=0){
             this.dtoAux=this.manager.obtenerPorId(IdInhabilitar);
             this.dtoAux.setEstadoDto(new ParametroDto(ConstantesDesa.Parametro.EVALUACION_COMPETENCIA_ESTADO_ANULADO));
             this.manager.editar(dtoAux);
             
             this.personaDto=this.dtoAux.getPersonaDto();
             this.personaDto.setEvCompetencia(null);
             this.personaDto.setEvCompetenciaDto(null);
             this.personaDto.setPromedioFinal(null);
             this.personaDto.setCuadrante(null);
             this.personaDto.setGt(0L);
             this.personaManager.editar(this.personaDto);
           }
            
           EvaluacionCompetenciaDto dtoAuxEvCom = this.dto;
           this.dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
           this.manager.guardar(this.dto);
           if(this.dto != null){
           this.dto = this.manager.obtenerPorId(this.dto.getId());
           return this.editar();
           }else{this.dto=dtoAuxEvCom;}
            
        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);
            showError(ex.getMessage());
        }
        return "";
    }

    public String retroceder() {
        buscar(null);
        sessionMBean.setAccion(ConstantesDesa.Formulario.LISTA);
        sessionMBean().setTitulo(recursosManager.construirTitulo(keyTitulo, sessionMBean().getAccion()));
        return ConstantesDesa.UrlNavegacion.URL_LISTA_EVALUACION_COMPETENCIA;
    }
    
    public String anular(){
       try {
                this.dto.setEstadoDto(new ParametroDto(ConstantesDesa.Parametro.EVALUACION_COMPETENCIA_ESTADO_ANULADO));
                this.manager.editar(dto);
                evCompetenciaPersona(null);
                procesarRedictVer();  
            } catch (Exception ex) {
                logger.error("ERROR DE SISTEMA", ex);
                showError(ex.getMessage());
            }
            return "";
    }
    
    public String procesarRedictVer(){
       try {
                EvaluacionCompetenciaDto dtoEvComAux=this.dto;
                if(this.dto != null){
                this.dto = this.manager.obtenerPorId(this.dto.getId());
                return this.ver();
                }else{this.dto=dtoEvComAux;}      
            } catch (Exception ex) {
                logger.error("ERROR DE SISTEMA", ex);
                showError(ex.getMessage());
            }
            return "";
    }
        public String procesarRedictEditar(){
       try {
                EvaluacionCompetenciaDto dtoEvComAux=this.dto;
                if(this.dto != null){
                this.dto = this.manager.obtenerPorId(this.dto.getId());
                return this.editar();
                }else{this.dto=dtoEvComAux;}      
            } catch (Exception ex) {
                logger.error("ERROR DE SISTEMA", ex);
                showError(ex.getMessage());
            }
            return "";
    }


    public void handleSelect(SelectEvent event) {         
     //   System.out.print("persona ID -->"+this.dto.getPersonaDto().getId());
        try {
            this.dto.setPuestoDto(this.dto.getPersonaDto().getPuestoDto());
            this.dto.setUnidadOrganicaDto(this.dto.getPersonaDto().getPuestoDto().getUnidadOrganicaDto());
           
             PersonaDto personaGt = new PersonaDto();
             personaGt= this.personaManager.obtenerPorId(this.dto.getPersonaDto().getId());
             Long gt=validarNull(personaGt.getGt());
              if(gt!=2 ){
              List<EvaluacionCompetenciaDto> listaEvaComp =this.manager.numerodeEvaluacionesCompetencia(this.dto.getPersonaDto());
              int total=listaEvaComp.size();
                if(total!=0){
                    showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.evaluacion.competencia"));
                  }
                }else{
                       showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.evaluacion.competencia.gestion.talento"));
                       this.desabilitarBotonProcesar=true;
                    }
           
          
           
        } catch (DAOException ex) {
            logger.error("ERROR DE SISTEMA", ex);
            showError(ex.getMessage());
        }
       
    }
    private Long validarNull(Long var){
        if(var==null){var = 0L;}
        return var;
    }

    public List<ParametroDto> getListaEstados() {
             List<ParametroDto> list = new ArrayList<ParametroDto>();
                for(ParametroDto param : this.recursosManager.obtenerParametrosActivosPorCatalogoSistema(ConstantesDesa.CatalogoParametro.EVALUACION_COMPETENCIA_ESTADOS)){
                    if(!param.getId().equals(ConstantesDesa.Parametro.EVALUACION_COMPETENCIA_ESTADO_HABILITADO)){
                        list.add(param);
                    }
                }
                return list;
    }
    
    public String procesarEvaComp(){
        try {
            if(this.dto.getPromedio()!=null && this.dto.getPromedio().compareTo(BigDecimal.ZERO)!=0L){
            this.dto.setEstadoDto(new ParametroDto(ConstantesDesa.Parametro.EVALUACION_COMPETENCIA_ESTADO_HABILITADO));
            this.manager.editar(dto);
 
            evCompetenciaPersona(this.dto.getPromedio());
            
            procesarRedictEditar();
            }else{
            showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("evaluacion.desarrollo.competencia.arbol.validar"));
            }
        } catch (Exception ex) {
            logger.error("ERROR DE SISTEMA", ex);
            showError(ex.getMessage());
        }
        return "";
    }
    
    private void evCompetenciaPersona(BigDecimal promedio){
            try {
                this.personaDto=this.dto.getPersonaDto();    
                if(promedio!=null){
                    this.personaDto.setEvCompetencia(promedio);
                    this.personaDto.setGt(ConstantesDesa.Parametro.EVALUACION_DESEMPENO_PERSONA_GT_INHABILITADO);
                    this.personaDto.setEvCompetenciaDto(this.dto);
                    editarEstadoEvaComp();
                    
                    if(this.personaDto.getEvDesempeno()!=null){
                      this.personaDto.setPromedioFinal(UtilCore.Numero.round(BigDecimal.valueOf((this.personaDto.getEvDesempeno().doubleValue()+promedio.doubleValue())/2),2));
                      this.personaDto.setCuadrante(generarCuadrante(this.personaDto.getEvCompetencia(),promedio));
                      this.personaDto.setGt(ConstantesDesa.Parametro.EVALUACION_DESEMPENO_PERSONA_GT_HABILITADO);
                    }
                }else{
                    this.personaDto.setEvCompetencia(null);
                    this.personaDto.setEvCompetenciaDto(null);
                    this.personaDto.setGt(0L);
                    this.personaDto.setPromedioFinal(null);
                    this.personaDto.setCuadrante(null);
                }
                this.personaManager.editar(this.personaDto);
            } catch (Exception ex) {
                logger.error("ERROR DE SISTEMA", ex);
                showError(ex.getMessage());
            }
    }
    private void editarEstadoEvaComp(){
            try {
                    this.dto.setEstadoDto(new ParametroDto(ConstantesDesa.Parametro.EVALUACION_COMPETENCIA_ESTADO_HABILITADO));
                    this.manager.editar(dto);
            } catch (Exception ex) {
                logger.error("ERROR DE SISTEMA", ex);
                showError(ex.getMessage());
            }
    }
    
    private String generarCuadrante(BigDecimal evC, BigDecimal evD){
        double evalComp=evC.doubleValue(),evalDesemp=evD.doubleValue();
        String cuadrante="X";
        if(evalComp==3 && evalDesemp==3){cuadrante="II";}
        else if(evalComp>3 && evalDesemp>3){cuadrante="I";}
        else if(evalComp>3 && evalDesemp<=3){cuadrante="II";}
        else if(evalComp<=3 && evalDesemp>3){cuadrante="III";}
        else if(evalComp<=3 && evalDesemp<=3){cuadrante="IV";}

        return cuadrante;
    }

    public void setListaEstados(List<ParametroDto> listaEstados) {
        this.listaEstados = listaEstados;
    }
    
    
    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        EvaluacionCompetenciaMBean.logger = logger;
    }

    public EvaluacionCompetenciaManager getManager() {
        return manager;
    }

    public void setManager(EvaluacionCompetenciaManager manager) {
        this.manager = manager;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public ProcesoEvaluacionManager getProcesoEvaluacionManager() {
        return procesoEvaluacionManager;
    }

    public void setProcesoEvaluacionManager(ProcesoEvaluacionManager procesoEvaluacionManager) {
        this.procesoEvaluacionManager = procesoEvaluacionManager;
    }

    public List<EvaluacionCompetenciaDto> getLista() {
        return lista;
    }

    public void setLista(List<EvaluacionCompetenciaDto> lista) {
        this.lista = lista;
    }

    public EvaluacionCompetenciaDto getDto() {
        return dto;
    }

    public void setDto(EvaluacionCompetenciaDto dto) {
        this.dto = dto;
    }

    public EvaluacionCompetenciaDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(EvaluacionCompetenciaDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public String getKeyTitulo() {
        return keyTitulo;
    }

    public void setKeyTitulo(String keyTitulo) {
        this.keyTitulo = keyTitulo;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }

    public List<PuestoDto> getListaPuestoFiltro() {
        PuestoManager puestoManager = (PuestoManager) WebServletContextListener.getApplicationContext().getBean("puestoManager");
        return puestoManager.obtenerPuestosActivosCombo();
    }

    public void setListaPuestoFiltro(List<PuestoDto> listaPuestoFiltro) {
        this.listaPuestoFiltro = listaPuestoFiltro;
    }

    public PersonaDto getPersonaDto() {
        return personaDto;
    }

    public void setPersonaDto(PersonaDto personaDto) {
        this.personaDto = personaDto;
    }

    public List<PuestoDto> getListaPuesto() {
        PuestoManager puestoManager = (PuestoManager) WebServletContextListener.getApplicationContext().getBean("puestoManager");
       return puestoManager.obtenerPuestosActivosCombo();
    }

    public void setListaPuesto(List<PuestoDto> listaPuesto) {
        this.listaPuesto = listaPuesto;
    }

    public Boolean getDesabilitarArbol() {
        return desabilitarArbol;
    }

    public void setDesabilitarArbol(Boolean desabilitarArbol) {
        this.desabilitarArbol = desabilitarArbol;
    }

    public Long getEstadoGT() {
        return estadoGT = ConstantesDesa.Parametro.EVALUACION_COMPETENCIA_ESTADO_GEST_TALENTO;
    }

    public void setEstadoGT(Long estadoGT) {
        this.estadoGT = estadoGT;
    }

    public Long getEstadoAnulado() {
        return estadoAnulado = ConstantesDesa.Parametro.EVALUACION_COMPETENCIA_ESTADO_ANULADO;
    }

    public void setEstadoAnulado(Long estadoAnulado) {
        this.estadoAnulado = estadoAnulado;
    }

    public EvaluacionCompetenciaDto getDtoAux() {
        return dtoAux;
    }

    public void setDtoAux(EvaluacionCompetenciaDto dtoAux) {
        this.dtoAux = dtoAux;
    }

    public Boolean getDesabilitarBotonProcesar() {
        return desabilitarBotonProcesar;
    }

    public void setDesabilitarBotonProcesar(Boolean desabilitarBotonProcesar) {
        this.desabilitarBotonProcesar = desabilitarBotonProcesar;
    }

    public List<ParametroDto> getListaUnidadOrgFiltro() {
       List<ParametroDto> list = new ArrayList<ParametroDto>();
       for(ParametroDto param : this.recursosManager.obtenerParametrosActivosPorCatalogoSistemaAdd(ConstantesSgc.CatalogoParametro.UNIDAD_ORGANICA, ConstantesCore.Parametro.TODOS)){
               list.add(param);
       }
       return list;
    }

    public void setListaUnidadOrgFiltro(List<ParametroDto> listaUnidadOrgFiltro) {
        this.listaUnidadOrgFiltro = listaUnidadOrgFiltro;
    }

    public List<ParametroDto> getListaEstadosFiltro() {
       List<ParametroDto> list = new ArrayList<ParametroDto>();
       for(ParametroDto param : this.recursosManager.obtenerParametrosActivosPorCatalogoSistemaAdd(ConstantesDesa.CatalogoParametro.EVALUACION_COMPETENCIA_ESTADOS, ConstantesCore.Parametro.TODOS)){
               list.add(param);
       }
       return list;
    }

    public void setListaEstadosFiltro(List<ParametroDto> listaEstadosFiltro) {
        this.listaEstadosFiltro = listaEstadosFiltro;
    }
 
}
